package com.sayi.dzapi.utils;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.security.Keys;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Key;
import java.util.Base64;
import java.util.Date;

public class JwtUtil {
    //TODO token覆盖机制：一个人产生的token只有最新的能生效；

    // 用于签名的密钥，通过 Base64 编码的字符串表示
    //private static final String SECRET_KEY = generateSecretKeyString();

    private static final String SECRET_KEY = "GSOSe8qYLo0McfTm/38s2UymFoYOvdZGifxqyfQzu8c=";//某次生成的密钥值
    /**
    * 由于generateSecretKeyString在每一次重启之后生成的值都不一样，
    * 所以在这里取其中一次生成的值作为后续的定值。
    */


    // 设置 JWT 的有效期，这里是 10 年
    private static final long EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 365 * 10;

    // 生成字符串形式的密钥
    private static String generateSecretKeyString() {
        Key secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);  // 生成一个 256 位密钥
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());  // 将密钥编码为 Base64 字符串
    }
    

    // 获取解码后的密钥
    private static Key getDecodedKey() {
        byte[] decodedKey = Base64.getDecoder().decode(SECRET_KEY);  // 解码 Base64 密钥字符串
        return Keys.hmacShaKeyFor(decodedKey);  // 使用解码后的字节数组生成 Key
    }

    // 生成 JWT
    public static String generateToken(int uid, String username) {
        return Jwts.builder()
                .setSubject(String.valueOf(uid))  // 设置 JWT 的主题，通常是用户名 //？改成uid，保证唯一性？
                .claim("username",username)
                .setIssuedAt(new Date())  // 设置签发时间
                //.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))  // 设置过期时间//这里去除了过期时间
                .signWith(getDecodedKey())  // 使用解码后的密钥进行签名
                .compact();  // 返回 JWT 字符串
    }

    // 解析 JWT
    public static Claims extractClaims(String token) {
        return Jwts.parser()
                .setSigningKey(getDecodedKey())  // 使用解码后的密钥解析 JWT
                .build()
                .parseClaimsJws(token)
                .getBody();  // 返回 JWT 的有效载荷
    }

    // 从 JWT 中提取用户id
    public static int extractUserId(String token) {
        return Integer.valueOf(extractClaims(token).getSubject());  // 提取 JWT 中的id
    }

    // 从 JWT 中提取用户名
    public static String extractUsername(String token) {
        return extractClaims(token).get("username", String.class);  // 提取 JWT 中的id
    }

    // 检查 JWT 是否过期
    /*public static boolean isTokenExpired(String token) {
        return extractClaims(token).getExpiration().before(new Date());  // 检查 JWT 是否过期
    }*/

    // 验证 JWT 是否有效
    public static boolean validateToken(String token, int userId) {
        return userId==extractUserId(token) /*&& !isTokenExpired(token)*/;  // 验证用户名和过期时间//这里去除了过期时间
    }

    // 获取密钥字符串（可选）
    public static String getSecretKeyString() {
        return SECRET_KEY;
    }
}
